﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace aaaaa
{
    class SpaceShip3D:GameObject3D
    {
        public float frontalDirection { get; set; }
        //public int AlcanceMaximo { get; set; }
        public bool ifPlayer;

        public const float Speed = 0.75f;
        public const float curveSpeed = 0.5f;//0.025f;

        public static List<SpaceShip3D> listSpaceShip3D = new List<SpaceShip3D>();

        public SpaceShip3D(Model model)
            : base(model)
        {
            frontalDirection = 0.0f;
            //AlcanceMaximo = 100;

            SpaceShip3D.listSpaceShip3D.Add(this);
        }
        public override void Update(GameTime gameTime)
        {


            if (!ifPlayer)
            {
                base.UpdateWorldAndCollisions();
                return;
            }


            //preciso testar *primeiro* se a posição futura é válida para não travar, por isso a guardo...
            Vector3 futurePosition = Position;

            //estas duas variáveis temporárias servem para o giro e o movimento
            float turnBy = 0;
            Vector3 movement = Vector3.Zero;

            if (Game1.keyboardState.IsKeyDown(Keys.A) || Game1.keyboardState.IsKeyDown(Keys.Left))
            {
                turnBy = 1;
            }
            else if (Game1.keyboardState.IsKeyDown(Keys.D) || Game1.keyboardState.IsKeyDown(Keys.Right))
            {
                turnBy = -1;
            }
            if (Game1.keyboardState.IsKeyDown(Keys.Up))
            {

                movement.Z = 1;
            }
            else if (Game1.keyboardState.IsKeyDown(Keys.S) || Game1.keyboardState.IsKeyDown(Keys.Down))
            {
                movement.Z = -1;
            }

            //o pra onde ele vai virar é corrigido pela velocidade de giro
            //DirecaoFrontal += quantoVirar * VelocidadeDeCurva;
            
            //isto está aqui apenas pq esta variável tem outro nome na hora de desenhar...
            RotationY += turnBy * curveSpeed;
            //preciso girar meu objeto naquela direção antes de andar
            Matrix orientationMatrix = Matrix.CreateRotationY(MathHelper.ToRadians(RotationY));
            //ando com ele aquela quantidade de movimento naquela direcao de orientacao
            Vector3 velocity = Vector3.Transform(movement, orientationMatrix);
            //corrijo pela escala da velocidade
            velocity *= Speed;
            //agora sim esta será a nova posicao do objeto
            futurePosition = Position + velocity;

            #region manter no tabuleiro

            //if (posicaoFutura.X > AlcanceMaximo)
            //{
            //    posicaoFutura.X = AlcanceMaximo;
            //}

            //if (posicaoFutura.Z > AlcanceMaximo)
            //{
            //    posicaoFutura.Z = AlcanceMaximo;
            //}

            //if (posicaoFutura.X < -AlcanceMaximo)
            //{
            //    posicaoFutura.X = -AlcanceMaximo;
            //}

            //if (posicaoFutura.Z < -AlcanceMaximo)
            //{
            //    posicaoFutura.Z = -AlcanceMaximo;
            //}

            #endregion

            Position = futurePosition;

            base.UpdateWorldAndCollisions();
        }
    }
}
